#pragma once

#include <iostream>
#include <string>
#include <functional>
#include "InetAddr.hpp"

class Reactor;
class Connection;

// 普通的fd, Listensockfd;
// 让对fd的处理方式 采用 同一种方式

// 描述一个连接  先描述
class Connection
{
public:
    Connection()
        : _sockfd(-1)
        , _events(0)
    {}
    // 获取客户端信息
    void SetPeerInfo(const InetAddr &peer_addr)
    {
        _peer_addr = peer_addr;
    }
    void SetSockfd(int sockfd)
    {
        _sockfd = sockfd;
    }
    int Sockfd() { return _sockfd; }
    void SetEvents(uint32_t events) { _events = events; }
    uint32_t GetEvents() { return _events; }
    void SetOwner(Reactor *owner)
    {
        _owner = owner;
    }
    Reactor *GetOwner()
    {
        return _owner;
    }
    void AppendToOut(const std::string& out)
    {
        _outbuffer += out;
    }
    // 防止读到不完整的数据
    void Append(const std::string &in)
    {
        // 把收到的数据，添加到自己的缓冲区
        _inbuffer += in;
    }
    // 从缓冲区中移除n个数据
    void DisCardOutString(int n)
    {
        _outbuffer.erase(0, n);
    }
    bool IsOutBufferEmpty() { return _outbuffer.empty(); }
    // for test
    std::string &OutString()
    {
        return _outbuffer;
    }
    // for test
    std::string &InBuffer()
    {
        return _inbuffer;
    }
    // 关闭文件描述符
    void Close()
    {
        if(_sockfd >= 0)
            close(_sockfd);
    }
    ~Connection()
    {}
    // 回调方法
    virtual void Sender() = 0;   // 读
    virtual void Recver() = 0;   // 发
    virtual void Excepter() = 0; // 异常处理
protected:
    int _sockfd;
    std::string _inbuffer;
    std::string _outbuffer;
    InetAddr _peer_addr; // 对应哪一个客户端

    // 添加一个指针
    Reactor *_owner;     // 这个指针回指向Reactor

    // 我关心的事件
    uint32_t _events;    // 我这个connection关心的事件
};